package com.zjw.socket.demo.starter.core.ioc;


import com.zjw.socket.demo.starter.annotation.Nullable;

/**
 * 提供ioc+di能力
 */
public interface IOCScope {

  /**
   * 全局IOC容器
   */
  IOCScope globalScope = new IOCScopeImpl();

  /**
   * 通过Class获取对应Bean
   */
  @Nullable
  <T> T getBean(Class<T> clazz);

  /**
   * 通过Name获取对应Bean
   */
  @Nullable
  <T> T getBean(String name);

  /**
   * 通过Class放置对应Bean
   */
  void putBean(Class<?> clazz, Object object);

  /**
   * 通过Name放置对应Bean
   */
  void putBean(String name, Object object);

  /**
   * 通过objectKey获取到BeanInfo
   */
  @Nullable
  IOCBeanInfo getBeanInfo(String objectKey);

  /**
   * 指定包下刷新所有标注类
   *
   * @see com.zjw.socket.demo.starter.annotation.core.Bean
   */
  void refresh(String basePackage);

  /**
   * 注册IOC过程观察者，以便扩展
   */
  void registerRefreshObserver(IOCObserver iocObserver);

}
